package protocol

import (
	"context"
	"net/http"
	"time"
	"vblog/conf"
	"vblog/logger"

	"github.com/gin-gonic/gin"
)

// 如果http 服务器使用哪个路由, 当作参数传递进来
func NewHttp(r *gin.Engine) *Http {
	return &Http{
		server: &http.Server{
			// 服务器的监听地址
			Addr: conf.C().Http.Address(),
			// 配置http server使用的路由
			// 如果是其他框架,这里传递其他框架的路由
			Handler: r,
			// client ---> server服务端读取客户端的请求超时时间
			ReadTimeout: 5 * time.Second,
			// server ---> client 服务端响应客户端的超时时间
			WriteTimeout: 5 * time.Second,
		},
	}
}

type Http struct {
	server *http.Server
}

func (h *Http) Start() error {
	logger.L().Debug().Msgf("http server: %s", conf.C().Http.Address())
	// http
	return h.server.ListenAndServe()

	//https
	// h.server.ListenAndServeTLS(certFile string, keyFile string)
}

func (h *Http) Stop(ctx context.Context) {
	//http 服务优雅关闭, 先关闭监听,新的请求无法进入,等待老的请求处理完成
	// 字节接收来自操作系统的信号量 来决定你的服务器是否需要关闭
	// nginx reload, os reload sign, config.reload
	// 当os termnial sign, 过了terminal的超时时间会直接kill掉
	h.server.Shutdown(ctx)
}
